#ifndef FILE_DB_H_
#define FILE_DB_H_
#include <stdbool.h>

typedef struct sfiles_db *files_db;

typedef struct sfile_db *file_db;

typedef struct spart_db *part_db;


/*
    Constructor del tipo files_db
*/
files_db
files_create(void);

/*
    Destructor del tipo files_db
*/
void
files_destroy(files_db files);

/*
    Meto un file en la lista
*/
void
files_add_file(files_db files, file_db file);

/*
    Pido la cantidad de archivos
*/
int
files_get_number_of_files(files_db files);

/*
    Constructor del tipo part_db
*/
part_db
part_db_create(int i);

/*
    Destructor del tipo part_db
*/
void
part_db_destroy(part_db part);

/*
    Pido el numero de parte a la que corresponde este pedazo
*/
int
part_db_get_num(part_db part);

/*
    Indico cuantos servidores tienen la partes
*/
void
part_db_set_num_servers(part_db part, int num);

/*
    Pido cuantos servidores tienen la partes
*/
int
part_db_get_num_servers(part_db part);

/*
    Pido el fd del server de donde estoy bajando el pedazo
*/
int
part_db_get_fd(part_db part);

/*
    Indico el fd del server de donde estoy bajando
*/
void
part_db_set_fd(part_db part, int fd);

/*
    Pido el numero de items que tengo encolados
*/
int
part_db_queue_size(part_db part);

/*
    Seteo el numero de items que tengo encolados
*/
void
part_db_set_queue_size(part_db part, int size);


/*
    Indico que tengo el pedazo completo
*/
void
part_db_completed(part_db part);

/*
    Indico que no tengo el pedazo completo
*/
void
part_db_not_completed(part_db part);

/*
    Pregunto si tengo el pedazo completo
*/
bool
part_db_is_complete(part_db part);

/*
    Indico que ya envie este pedazo
*/
void
part_db_sent(part_db part);

/*
    Indico que no envie el pedazo
*/
void
part_db_not_sent(part_db part);

/*
    Pregunto si envie el pedazo
*/
bool
part_db_is_sent(part_db part);

/*
    Seteo el MD5
*/
void
part_db_set_md5(part_db part, char *md5);

/*
    Pido el MD5
    IMPORTANTE: NO LIBERAR EL CHAR DEVUELTO YA QUE NO ES UNA COPIA
*/
char *
part_db_get_md5(part_db part);

/*
    Agrego un servidor
*/
void
part_db_add_server(part_db part, char *server);

/*
    Pido el primer servidor
    NULL en caso de no haber ninguno
*/
char *
part_db_get_server(part_db part);

/*
    Elimino el primer servidor
*/
void
part_db_remove_server(part_db part);

/*
    Llevo el primer servidor al fondo y muevo todos para adelante
*/
void
part_db_swap_servers(part_db part);

/*
    Encolo el primer servidor
*/
void
part_db_enqueue(part_db part);

/*
    Pido el servidor en la posicion i de la cola
    IMPORTANTE: NO LIBERAR LO DEVUELTO YA QUE NO ES UNA COPIA
*/
char *
part_db_get_server_from_queue(part_db part, int i);

/*
    Elimino el servidor ubicado en la posicion i de la cola
*/
void
part_db_remove_from_queue(part_db part, int i);

/*
    Constructor del tipo file_db
*/
file_db
file_db_create(char *name, char *md5, int slices, int size);

/*
    Destructor del tipo file_db
*/
void
file_db_destroy(file_db file);

/*
    Funcion para obtener el nombre del archivo
*/
char *
file_db_get_name(file_db file);

/*
    Funcion para obtener el md5 del archivo
*/
char *
file_db_get_md5(file_db file);

/*
    Funcion que me devuelve cuantas partes tiene el archivo
*/
int
file_db_get_slices(file_db file);

/*
    Funcion que me devuelve el tamaño del archivo en bytes
*/
int
file_db_get_size(file_db file);

/*
    Marco cuantas partes del archivo ya he pedido
*/
void
file_db_set_requested(file_db file, int requested);

/*
    Pregunto cuantas partes ya he pedido
*/
int
file_db_get_requested(file_db file);

/*
    Indico que tengo el archivo completo
*/
void
file_db_finished(file_db file);

/*
    Indico que no tengo el archivo completo
*/
void
file_db_not_finished(file_db file);

/*
    Pregunto si tengo el archivo completo
*/
bool
file_db_has_finished(file_db file);

/*
    Indico que ya le informé al tracker sobre este archivo
*/
void
file_db_index_informed(file_db file);

/*
    Indico que el tracker todavia no conoce este archivo
*/
void
file_db_index_not_informed(file_db file);

/*
    Pregunto si le he informado al tracker sobre este archivo
*/
bool
file_db_is_index_informed(file_db file);

/*
    Funcion para obtener la parte i
    IMPORTANTE: NO DESTRUIR EL ITEM, YA QUE NO ES UNA COPIA
*/
part_db
file_db_get_part(file_db file, int i);

#endif /*FILE_DB_H_*/
